package main

import (
	"net/http"
	"time"

	"github.com/gin-gonic/gin"

	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func myNewProduction(options ...zap.Option) (*zap.Logger, error) {
	return myNewProductionConfig().Build(options...)
}

func myNewProductionConfig() zap.Config {
	config := zap.NewProductionConfig()
	config.OutputPaths = []string{"./test.log"}
	// 修改时间格式：
	config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	return config
}

func getLogWriter() zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename:   "./test.log", // 导入文件名
		MaxSize:    10,           // 大小M兆
		MaxBackups: 5,            // 最大备份数量
		MaxAge:     30,           // 最大备份天数
		Compress:   false,        // 是否压缩
	}
	return zapcore.AddSync(lumberJackLogger)
}

func main() {
	// 创建文件对象
	//file, _ := os.Create("./getLog.log")
	//file, _ := os.OpenFile("./getLog.log", os.O_APPEND | os.O_RDWR, 0744)
	// 生成 WriteSyncer
	//wSy := zapcore.AddSync(file)
	// 创建一个 logger, 可以选择其他预置创建，会有不同的输出效果
	encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
	writeSyncer := getLogWriter()
	newCore := zapcore.NewCore(encoder, writeSyncer, zapcore.InfoLevel)
	logger := zap.New(newCore)
	for i := 0; i < 10000; i++ {
		logger.Info("成功访问！",
			// 作为强类型字段值的结构化上下文.
			zap.String("url", "测试归档"),
			zap.String("status", "添加数据"),
			zap.Duration("backoff", time.Second),
		)
	}
	defer logger.Sync() // flushes buffer, if any， 刷新缓冲区，存盘
	// 定义url
	url := "http://www.baidu.com"
	resp, err := http.Get(url)
	// 直接出错日志
	if err != nil {
		logger.Error("访问失败了",
			zap.String("url", url),
			// 跟上错误信息
			zap.Error(err),
		)
	} else {
		// info 级别的日志信息打印
		logger.Info("成功访问！",
			// 作为强类型字段值的结构化上下文.
			zap.String("url", url),
			zap.String("status", resp.Status),
			zap.Duration("backoff", time.Second),
		)
		resp.Body.Close()
	}

	r := gin.Default()
	r.Use()
}
